package com.tarena.charging.user.service;

import com.alibaba.cloud.commons.lang.StringUtils;
import com.alibaba.fastjson2.JSON;
import com.tarena.charging.user.pojo.dto.WxLoginDto;
import com.tarena.charging.user.pojo.po.UserPO;
import com.tarena.charging.user.repository.UserRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
@Slf4j
public class WxLoginService {
    private String appId="wxf7546f9b87546078";
    private String secret="439f1504f2bf53ae5d3dcbb5657bc7e1";
    @Autowired
    private UserRepository userRepository;
    public Integer login(String code, String nickName) {
        //1.到微信 反问授权接口 拿到openId 一个openId代表一个微信登录
        String openId=getOpenId(code);
        //2.如果openId(为空说明微信授权失败不允许登录) 不为空
        if (StringUtils.isNotEmpty(openId)){
            //授权成功
            UserPO userPO=userRepository.getUserByOpenId(openId);
            //判断是否是空 说明是第一次登录 一并给用户注册
            if (userPO==null){
                //到数据库查询用户详情 如果能查到说明曾经登录注册过 如果查不到说明用户没注册
                //新增到数据 将userId返回
                userPO=new UserPO();
                userPO.setWxOpenId(openId);
                userPO.setNickName(nickName);
                userRepository.save(userPO);
            }
            return userPO.getId();
        }else{
            //授权失败
            return -1;//和前端对接 -1代表的含义告诉前端 在接口文件明示
        }
    }
    //发起一个http请求 请求地址中的参数需要和我们的业务对接
    @Autowired
    private RestTemplate restTemplate;
    private String getOpenId(String code) {
        String url="https://api.weixin.qq.com/sns/jscode2session?" +
                "appid="+appId+
                "&secret="+secret+
                "&js_code="+code+
                "&grant_type=authorization_code";
        String json = restTemplate.getForObject(url, String.class);
        log.info("拿到登录授权结果:{}",json);
        //转化
        if (json!=null){
            WxLoginDto dto = JSON.parseObject(json, WxLoginDto.class);
            if (dto!=null){
                return dto.getOpenid();
            }
        }
        return null;
    }
}
